package com.github.yoojia.flow;


/**
 * 虚拟设备
 * @author 2017 Yoojia Chen (yoojiachen@gmail.com)
 */
public abstract class VirtualDevice extends InitialContext {

    private String mAddress;

    /**
     * 设置虚拟设备地址
     * @param address 地址
     */
    final void setAddress(String address) {
        mAddress = address;
    }

    /**
     * 获取虚拟设备的地址
     * @return 地址
     */
    final public String getAddress() {
        return mAddress;
    }

    /**
     * 启动
     */
    public abstract void onStart();

    /**
     * 停止
     */
    public abstract void onStop();

    /**
     * 处理事件，并获取处理结果
     * @param context Context
     * @param request 事件
     */
    public abstract Event handleEvent(Context context, Event request);

    /**
     * 发送事件
     * @param event 事件
     */
    protected void postEvent(Event event) {
        getContext().publishEvent(event);
    }

    /**
     * 返回此虚拟设备是否开启了调试功能
     * @return 是否开启
     */
    protected boolean isLoggingEnabled() {
        return getInitConfig().getBoolean("debug", false);
    }

    /**
     * 创建一个带设备地址的消息，用于跟踪调试
     * @param text 消息
     * @return 消息
     */
    protected String traceableMessage(String text) {
        return text + "@" + getAddress();
    }

    /**
     * 创建Response Event
     *
     * @param payload Payload
     * @param request 请求Event
     * @return Response Event
     */
    protected Event createResponseEvent(Event request, String topic, byte[] payload) {
        return createEvent(
                request.sequence,
                payload,
                topic,
                getAddress(),
                request.sourceAddress);
    }
}
